23

» WarCraft 3 / Интерфейс разных рас

Принятый ответ
Похожие вопросы:

ответ
Для отображения интерфейса необходима только модель, не нужно для ее роботы новых текстур.
ВарКрафт ссылается на модели для отображения гемплея, а в свою очередь модели ссылаются на текстуры.
Хитрость в том что можна создавать 15 моделей с одинаковыми текстурами.

23

» WarCraft 3 / как открыть карту в редакторе?

Похожие вопросы:

ответ
советую переименовать модель\заребутить комп
текстуры стандартные юзал, я так понимаю
ответ
~8gabriel8:
Не знаю почему, но после нескольких попыток открыть карту в mpq-редакторе, файлы текстур появились, я их заменил и карта открылась.
ответ
Trickster, ну так будет 100р?
В карте испоганен заголовок и хешьтаблица и удалены данные об обьектах, поэтому она не открывается ничем кроме зезулы, но зезула не дает возможность редактировать файлы. Ну собственно я это дело снял, могу восстановить открываемость в редакторе..
ответ
Первая рпгшка со слабой hex защитой, повреждение заголовка, спокойно открывается что ладиком что RMPQ, код смесь гуи + vjass систем, данные о войсках на карте и триггерах удалены, в коде не сжаты имена (автор не знает про тулы векса), вторая карта тоже самое.
Сломать их раз плюнуть, рассказывать как и зачем я не буду, инфы пруд пруди.

23

» WarCraft 3 / Id приказа

Похожие вопросы:

ответ
>> IssueInstantTargetOrder: The only use of this function is to make units give items from their inventory to other units. The order in this case would be smart, the target widget is the item and the instant target widget is the target unit. The ordered unit will then move towards the target unit and hand the item over.
>>These natives have terribly confusing names, but I've heard that they are for manipulating items. I.e. Give this item (one widget argument) to this unit (another widget argument) or drop it at this point. I don't know which argument is the item and which is the target unit though.
гугл помог, а память подвела, покупка через Neutral* приказы делается
ответ
Steal nerves:
вот
раскрыть
852000 (skillmenu): Приказ (без указания цели), при выполнении которого открывается меню навыков героев. Если же триггерно заставить выполнить этот приказ обычную боевую единицу, то исчезнет ее карта команд, которая возвратится, если выбрать боевую единицу.
851994 (buildmenu): Приказ (без указания цели), открывающий меню строительства воина, способного возводить здания.
Но эти приказы 852000 и 851994 не ловятся при нажатии, эти приказы нужно чтобы отдать боевой единице открыть меню скилов или строительства, а вот отловить не получится.
ответ
Число зависит от слота инвентаря, в котором лежит использованный предмет
Кстати не знаю как у других, а у меня оглушенный юнит игнорирует приказы и триггер их не ловит
ответ
Юзает первый скилл, потом второй. Ну у меня так было) Закрывай тему ибо ответили
ответ
Интересно зачем? Вы в курсе что это номер по которому движок ищит в списке что ему делать а еше куда рисовать кулдаун и прочее? Есть ограниченное число приказов и вся нужны, изменять ид приказа абилкам - бесполезно, исключение канал и поставка ресурсов - там есть отдельный обработчик, который смотрит что база канал а после уже идет все остальное. Каналу id приказа меняем из соображения кулдауна на панели приказа, остальное, другое применение у id приказа нет.

23

» WarCraft 3 / Про отряды

Похожие вопросы:

ответ
тебе для начала надо научится пользоваться группами
прочти статьи ибо ты написал бред в вопросе
ответ
Сначало создай юнит без москиты потом его в группу дай а после чего дай маскит ему и все
ответ
нет, после ретурна выполнение функции прекращается
заводишь глобальную переменную и в неё всё складываешь
globals
group TempGroup=CreateGroup()
endglobals

function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    call GroupEnumUnitsInRect(TempGroup, r, filter)
    call DestroyBoolExpr(filter)
    return TempGroup
endfunction
ни чистить, ни разрушать эту группу в ходе игры не надо вообще

23

» WarCraft 3 / Немного про return

Похожие вопросы:

ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
ответ
Игра дает не всегда точное значение высоты.
Высоты чего? Ландшафта? Или юнита? Летающего юнита?
Пока лучше используй наземных даммиков, ибо с летающими пока все запущено.
Возможно, в новом патче пофиксят. Если он вообще будет...

23

» WarCraft 3 / Направление триггерных спеллов

Похожие вопросы:

ответ
Pick every unit in range [250] matching condition [бафф спелла]
Всё что находится внутри данного блока произойдёт столько раз, сколько воинов находится внутри выбранной группы. Обратиться к воину можно через Picked Unit ( GetEnumUnit( ) ). Если Вам нужно добавить событие на смерть именно этих воинов, то прямо здесь внутри блока добавляете их в событие триггера, выбрав их через Picked Unit, или сохраняете их в переменные.

Также можно не сохранять каждого воина, а занести их в отдельную группу. А вместо проверки:
Условие: Dying unit = Aim [Integer A]
проверяете, находится ли воин в группе.

23

» WarCraft 3 / Карта и программы

Похожие вопросы:

ответ
В этом архиве ищи свои скиллы, в [скобках] смотри нужный ID.
ответ
В конце ноября 2016 года Blizzard выпустили патч, позволяющий играть по сети в карты до 128 Мб.
ответ
XGM Bot:
Похожие вопросы:

ответ
никак
ответ
Ну да, после этого в редакторе карт не откроешь. Но им и никто не пользуется для этого, когда есть MPQ Editor.
ответ
lll_Kirito_lll:
Хочется иметь у себя только модель допустим )
Как вариант, сделать так, что бы модель была разбита на множество текстур которые раскиданы по самым дурацким путям. Ни какой картодел не будет вытаскивать такую модель, ни за что.
ответ
Tumart:
quq_CCCP, а можно поподробнее? И это защитит карту от инжекта?
Подробно - это сделай за меня?
Суть:
 call  BJDebugMsg( I2Sx( 100500  ) )
Выдаст разные значения в депротектнутой и нормальной картах, пока это теория но возьмите и проверьте.
I2Sx - фольклорная функция ретурн бага, суть преобразует хеш от строки в строку. именно хеш а не инт. т.е адрес в таблице строк на строку.
вот RetunrBug ( www.hiveworkshop.com/threads/accessing-memory-from-the-script-it... )
функция в либе Typecast - I2SH
Ну кароче проверил:
function Trig_J_Test_Actions takes nothing returns nothing
    local integer i = 486
    local string str = null
    set str = S2S( I2SH( i ) )
    call BJDebugMsg( str )
    set str = null
endfunction

//===========================================================================
function InitTrig_J_Test takes nothing returns nothing
    set gg_trg_J_Test = CreateTrigger(  )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_J_Test, Player(0) )
    call TriggerAddAction( gg_trg_J_Test, function Trig_J_Test_Actions )
endfunction
При добавлении, удалении 3 функций сменяется строка по этому адресу, самое главное найти последнюю строку (ну или как я от балды ввел число) хотя я не уверен что прокатит с числом от балды, нужно найти последнюю строку на момент загрузки карты и смотреть её адрес, а после смотреть что будет записано по этому адресу в таблице строк.
ответ
Karp, Ой способов защиты 100500, щяс есть мемхак, я уже выкладывал пример как проверить вводились ли в код карты измненения.
Так же есть возможность писать код карты байткодами, которые внезапно низя прочитать или перевести в JASS это внутренние инстркции JASS машины. Но это достаточно сложно. Так же Можно загружать свои ДЛЛ, а это дает полный контроль над картой, можно зашифровать и сжать данные в архиве хер знает какими алгоритмами которые никогда не видел варкравт, а при загрузке срипта вызывать Дллку которая бы и расшифровывала это дело и вызывала функцию чтения архива + проверяла контрольную сумму архива (вроде в мемхаке была эта функция), контрульная сумма не та - выгружаем из ДЛЛ вирус, чтонить на подобии шифровальщиков. И читерам уже не до карты и варкравта в целом...
Это не для гуи новичков, придется долго морщить лоб и писать карту на jass + малость в с++ шарить.

ответ
приложи лучше .txt файл с крашем из папки /errors
ответ
Нужно править руками файл war3map.imp чтобы импорт отображался в редакторе. И файл лист проверить что все верно...

23

» WarCraft 3 / Область воздействия

Похожие вопросы:

  1. Aoe
ответ
аура есть аура, она не будет распространится на атаку юнита, используйте орб эффект, к примеру сферу замедления чтобы юнит при атаке накладывал на врага некоторый эффект.
ВНИМАНИЕ большинство орбов не складываются, поэтому если для вас это критично то скачиваем систему отлова физ урона и делаем пассивку полностью триггерно.
ответ
Путь можно отыскать в MPQ-файлах. Например, ReplaceableTextures\Selection\SpellAreaOfEffect.blp
ответ
Сам делаю такую систему для второго этажа - делаеш тригер со своей инициализацией и потом через действие первращаеш юнита в летающего и повышаеш высоту полета. Если я говорю что-нибуть не так, то сам хотел бы посмотреть на пример других людей.
ответ
Юнитов поднимает тогда же, когда и опускает, потому что я удаляю их из DedG[3], но забываю удалить из группы снарядов, таким образом, к тем кто попал под падение, уже навечно задействован акт снарядов(опускание), пока они в DedG[3]
ответ
Ну это сплеш, на тип урона не проверял, область настраивается и кол-во урона, оно же урон по аое.
Не все, а орбы предметов, орб может включить вторую атаку героя, только если она изначально выключена и есть. По этой причине владельцы орбов порой считаются юнитами дальнего боя, что разумеется не так (вторая атака всегда атака дальнего боя у всех дефолтных героев в варкравте, особо вторую атаку никто не настраивает.)
В орбах вроде сферы огня нету ничего интересного или полезного, лучше делать руками те эффекты которые они дают.

23

» WarCraft 3 / Хендл таймера

Похожие вопросы:

ответ
адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
ответ
спойлер - хештаблицы медленнее в сравнении с доступом по массиву. как только ты дописываешь еще пару строк к массиву (т.к. тебе надо вычислить ключ), внезапно хт становится быстрее. так что не мудри
нет ничего быстрее нативок. а каждая строка JASS-кода существенно замедляет работу. Экономия на спичках
ответ
ALL_Remove = false
чтотооченьважное
ALL_Remove = true
как сложно то было

23

» WarCraft 3 / Как скрыть карту приказов?

Похожие вопросы:

ответ
Пассивки в книге заклинаний работают, даже если запретить доступность самой книги для игрока.Так что да.
ответ
без мемхака - нет
ответ
Оба файла удаляются, потому что ты импортируешь их в карту через программу и не добавляешь данные о файлах в файл импорта(war3map.imp). При сохранении карты в редакторе архив пересобирается, и в него добавляются сторонние файлы, которые сохранены в том самом файле импорта. Поэтому используй стандартный менеджер импорта в редакторе.

23

» WarCraft 3 / Хостбот

Похожие вопросы:

ответ
Тут сможет помочь только "мемхак", который выполнит загрузку необходимых файлов и по свей сути выполнит работу трояна. В остальном автоматически без хостбота этого сделать нельзя.

23

» Администрация XGM / Как создать проект?

Принятый ответ
Похожие вопросы:

ответ
ответ
В своём проекте нужно перейти в пункт меню "Участники", после чего проскролить страницу вниз - слева будут блоки приглашения юзеров в проект.
ответ
Краткая инструкция:
1)Научится писать на русском языке и подумать "Достойна ли твоя работа сайта?"
2)Обратить внимание на плюс справа вверху сайта и подробно изучить выпадающую менюшку.
3)Если хочешь залить карту на вар, то открываешь любой ресурс Вара и ищешь слева кнопку "Добавить ресурс"
4)Скрины добавляются таким способом. Внизу редактирования ресурса или комментария кнопка "прикрепить файлы". Нажимаешь её, загружаешь картинку и вставляешь на неё ссылку специальной кнопкой.
От уровня зависит максимальное количество твоих проектов на сайте. А так можно хоть с первого.
Мой совет тебе на будущее: "Убедись, что твои идеи стоят труда потраченного на них и не берись за что-то что не сможешь сделать..."
ответ
Нужно внимательнее читать правила. Все проекты, которые видны другим пользователям, проходят премодерацию - модератор должен утвердить вносимые изменения. Обычно это простая формальность и нужно просто дождаться модератора.
ответ
участники - приглашение

23

» WarCraft 3 / Способность-тип

Похожие вопросы:

ответ
Короче, я закрою вопрос. Закажу в акции буйство спелмейкера.
ответ
Наименее ресурсозатратным для игрового процесса будет кастовать саму волну через отдельного дамми, который создаётся специально и только для волны силы. Сама волна наносит 1 ед урона. И потом определив, тип юнит-источника урона - наносим нужный урон от лица героя-хозяина юнита "волна силы".
В варианте "чекать группы каждые 0.0х сек" будет засоряться память и скорее всего будут подлагивания, в варианте со спец-дамиками засорится РО, выбирай из двух зол.
ответ
~16GB:
Создаёт стену из магического льда, которая отталкивает противников от себя.
function IsUnitDeadBX takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

function IsTarget takes unit u,unit d returns boolean
return not IsUnitType(u,UNIT_TYPE_ANCIENT) and not IsUnitDeadBX(u)  and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and (IsUnitEnemy(u, GetOwningPlayer(d)) or GetOwningPlayer(u) == Player(15))
endfunction

function SQ takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function SafeX takes real pxx returns real
local real lfr=GetRectMinX(bj_mapInitialPlayableArea)+50
if(pxx<lfr)then
return lfr
endif
set lfr=GetRectMaxX(bj_mapInitialPlayableArea)-50
if(pxx>lfr)then
return lfr
endif
return pxx
endfunction

function SafeY takes real pyy returns real
local real lfr=GetRectMinY(bj_mapInitialPlayableArea)+50
if(pyy<lfr)then
return lfr
endif
set lfr=GetRectMaxY(bj_mapInitialPlayableArea)-50
if(pyy>lfr)then
return lfr
endif
return pyy
endfunction

function UBU takes unit u, unit d, unit c , real w returns boolean
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real r1 = 57.295827*Atan2(y-GetUnitY(d),x-GetUnitX(d))
local real r2 = 57.295827*Atan2(y-GetUnitY(c),x-GetUnitX(c))
set r2 = r2 -180
if r1 < 0.00 then
set r1 = r1 + 360
endif
if r2 < 0.00 then
set r2 = r2 + 360
endif
if r1 - r2  <= w and r1 - r2  >= -(w) then
return true
else
return false
endif
endfunction


function IceWallCon takes nothing returns boolean
return GetSpellAbilityId() == 'A0KP'
endfunction

function IceWallCreate takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local real r = LoadReal(udg_AssassinHash,id,3)
local integer i = LoadInteger(udg_AssassinHash,id,4)
local integer j = LoadInteger(udg_AssassinHash,id,5)
local real x = LoadReal(udg_AssassinHash,id,StringHash("X"))
local real y = LoadReal(udg_AssassinHash,id,StringHash("Y"))
local real a = 0.
local real b = 0.
local boolean e = LoadBoolean(udg_AssassinHash,id,6)
local boolean f = LoadBoolean(udg_AssassinHash,id,7)
local boolean k = LoadBoolean(udg_AssassinHash,id,8)
local integer n = LoadInteger(udg_AssassinHash,id,25)
local real X2 = LoadReal(udg_AssassinHash,id,StringHash("X2"))
local real Y2 = LoadReal(udg_AssassinHash,id,StringHash("Y2"))
local real X3 = LoadReal(udg_AssassinHash,id,StringHash("X3"))
local real Y3 = LoadReal(udg_AssassinHash,id,StringHash("Y3"))
local integer h = 0
local group g = LoadGroupHandle(udg_AssassinHash,id,2)
local unit u
local unit d
local unit d1
if e == false then
set i = i+1
set j = j+1
if i < 7 then
set a = SafeX(x+(80.*i)*Cos(r))
set b = SafeY(y+(80.*i)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(i)),d)
set a = SafeX(x-(80.*j)*Cos(r))
set b = SafeY(y-(80.*j)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)),d)
call SaveInteger(udg_AssassinHash,id,4,i)
call SaveInteger(udg_AssassinHash,id,5,j)
else
call SaveBoolean(udg_AssassinHash,id,6,true)
endif
else
if f == false then
call SaveInteger(udg_AssassinHash,id,4,0)
call SaveReal(udg_AssassinHash,id,3,r-1.566)
call TimerStart(t,.025,true,function IceWallCreate)
call SaveBoolean(udg_AssassinHash,id,7,true)
else
set i = i+1
if i < 201 then
call SaveInteger(udg_AssassinHash,id,4,i)
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU16"))
set d1 = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU26"))
call GroupClear(udg_G)
call GroupEnumUnitsInRange(udg_G,x,y,1040,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) and UBU(u,d,d1,20.) and IsUnitInGroup(u,g) == false then
call GroupAddUnit(g,u)
if GetUnitAbilityLevel(c,'B009') > 0 then
call UnitDamageTarget(c,u,150.+80.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
else
call UnitDamageTarget(c,u,75.+40.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
endif
set n = n+1
call SaveInteger(udg_AssassinHash,id,25,n)
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(n)),15)
if SQ(X3,Y3,GetUnitX(u),GetUnitY(u)) > SQ(X2,Y2,GetUnitX(u),GetUnitY(u)) then
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,20))
else
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,21))
endif
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(n)),u)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\FrostArrows\\NagaColdArrowMissile.mdl",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) or not IsTarget(u,c) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
else
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
if k == false then
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"))
call KillUnit(d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call SaveBoolean(udg_AssassinHash,id,8,true)
endif
if k and n <= 0 then
call DestroyGroup(g)
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
endif
endif
endif
endif
set t = null
set c = null
set d = null
set d1 = null
set g = null
set u = null
endfunction

function IceWall takes nothing returns nothing
local unit c =  GetSpellAbilityUnit()
local real a = GetUnitX(c)
local real b = GetUnitY(c)
local real x = SafeX(GetSpellTargetX())
local real y = SafeY(GetSpellTargetY())
local real r = Atan2(y-b,x-a)+1.566
local timer t = CreateTimer()
local real dist = SQ(a,b,x,y)*2.
local integer id = GetHandleId(t)
local unit d
set d = CreateUnit(GetOwningPlayer(c),'e00V',x,y,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"),d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",x,y))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",x,y))
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveReal(udg_AssassinHash,id,3,r)
set r = Atan2(y-b,x-a)
call SaveReal(udg_AssassinHash,id,20,r)
call SaveReal(udg_AssassinHash,id,21,Atan2(b-y,a-x))
call SaveReal(udg_AssassinHash,id,StringHash("X2"),a+dist*Cos(r))
call SaveReal(udg_AssassinHash,id,StringHash("Y2"),b+dist*Sin(r))
call SaveReal(udg_AssassinHash,id,StringHash("X3"),a)
call SaveReal(udg_AssassinHash,id,StringHash("Y3"),b)
call SaveGroupHandle(udg_AssassinHash,id,2,CreateGroup())
call SaveReal(udg_AssassinHash,id,StringHash("X"),x)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),y)
call TimerStart(t,.025,true,function IceWallCreate)
set t = null
set c = null
set d = null
endfunction
ответ
Система отлова физ.урона а далее делай что хочется...
ответ
Условие: (Issued order) равно (Order(unimmolation))
Точно!)) Как-то так на гуи будет. ^^^^
Это для Жара преисподней.

23

» WarCraft 3 / common.j и blizzard.j

Похожие вопросы:

ответ
Нигде. Нет их. Стандартные спеллы не написаны на JASS, тебе же уже сказали.
ответ
Сдаётся мне что в таких недрах не ступала нога среднестатистического варкрафтера.
ответ
Возможно, упустил то, что в игре прибиты гвоздями 4 расы и изменение визуальных файлов никак не меняет игровой код?
ответ
Имена бж функций есть в..blizzard.j, чтобы они не конфликтовали с вашими способностями - чекайте софтом код абилок и близард ж файл, на предмет одинаковых имен и правьте, а так еще советую тулы векса или хеави лок - они сжимают имена и небудет проблем с именами функций и переменных в скрипте.

23

» WarCraft 3 / Массив таймера

Похожие вопросы:

ответ
Так и есть, а почему его убрал. Я писал про запуск, но не про паузу/остановку. И в принципе всё.
ответ
A.W.K.:
событие кстати такое есть таймер истекает, а вот условия я не найду и как раз ставится эта переменная с индексом
Есть, Как оно называется? Я такого никак не найду. Есть только "Таймер истекает", но в этом событии нужно указывать КАКОЙ таймер истекает.
а больше и нет, дальше нужно создавать таймеры, и уже вписывать эти таймеры в событие. Я не триггерщик я обычный человек, один из знающих людей тебе уже отвечали выше
ответ
но что делать, если этот параметр занят?
Перенести то, чем занят этот параметр, в массив переменных (под тем индексом, который будет в CustomValue).
ответ
спойлер - хештаблицы медленнее в сравнении с доступом по массиву. как только ты дописываешь еще пару строк к массиву (т.к. тебе надо вычислить ключ), внезапно хт становится быстрее. так что не мудри
нет ничего быстрее нативок. а каждая строка JASS-кода существенно замедляет работу. Экономия на спичках

23

» WarCraft 3 / Размер шрифта

Похожие вопросы:

ответ
Zeuz, Courier New
SomeFire, скорее всего он имеет ввиду шрифты джасс кода
настраивается кнопочкой Options при редактировании джасс кода
ответ
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local unit s=GetEventDamageSource()
    local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
    local texttag tt=CreateTextTag()
    local real dmg=GetEventDamage()

    if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
        if GetPlayerId(GetOwningPlayer(u))==12 then
            call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
        else
            call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
        endif
        call SetTextTagPosUnit(tt, u, 0)
        call SetTextTagColor(tt, 255, 255, 255, 255) 
        call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
        call SetTextTagPermanent(tt, false)
        call SetTextTagLifespan(tt, 1.0)
        call SetTextTagFadepoint(tt, 0.0)
    endif
    call PolledWait(2.0)

    call DestroyTextTag(tt)
    set u=null
    set s=null
    set i=0
    set dmg=0
    set tt=null
endfunction

function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
    call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction

function theSDMSTriggerActions takes nothing returns nothing
    local trigger UnitEnter=CreateTrigger()

    call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
    call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)

    set UnitEnter=null
endfunction

function InitTrig_the_SDMS_Trigger takes nothing returns nothing
    local trigger tr=CreateTrigger()

    set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
    call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
    call TriggerRegisterTimerEventSingle(tr,0.0)
    call TriggerAddAction(tr,function theSDMSTriggerActions)

    set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер

23

» WarCraft 3 / Привет

Похожие вопросы:

ответ
Туман рики есть обычный туман ястреба, настраиваешь там предотвращённые атаки и шанс промаха, но здесь есть кое-какой провал.
Дело в том, что туман устроен так багнуто, что может работать нормально только у красного игрока.
Вообщем делать надо вот так:
Создаём дамми для каста тумана, для игрока 1 красный!
Если сам туман скастовал союзник первой команды, то даём туман, действующий на врагов(в допустимых целях враги)
Если сам туман скастовал враг первой команды(враг красного), то даём туман, действующий на союзников(в допустимых целях союзники)
Вот так
ответ
Obelick:
нужно на время дать этому юниту способность "превратится в ворона", тогда он будет менять высоту триггерно.
Увы не работает, можно проиграть анимацию из раздела "Sea" (есть у юнитов анфибий), тогда они утопнут в грунте будто в воде, но увы не у всех моделей есть такое свойство, ну либо делать у модели вашего героя анимацию проваливания под землю.
ответ
BattleMaster, пишем по теме пожалуйста, не зачем разводить флуд.
Как ни странно, но к такому результату привело изменение файла "ItemData.slk". Но все же хотелось бы узнать, какая именно из строк отвечает за квадраты.
ответ
nvc123, внутри GetRectCenter нет утечки
// blizzard.j:1772
function GetRectCenter takes rect whichRect returns location
    return Location(GetRectCenterX(whichRect), GetRectCenterY(whichRect))
endfunction
а эвент регистрируется 1 раз, так что можно забить
// blizzard.j:7959
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Другое дело, что у order есть утечка, но это нативно, она минимальная и это никак не исправляется.
ответ
Чаво? Это стандартная функция удаления триггера.

23

» WarCraft 3 / Полоска здоровья

Похожие вопросы:

ответ
убрать полоску и поставить свою
на сайте есть наработка по созданию своих баров
ответ
Еще, если задать юниту макс хп (вроде от 1000000) оно не отображается. А триггерно убивать всех у кого порог ниже этой отметки
ответ
Настройки- Игра-Индикаторы здоровья(убери галочку), или отожми клавишу Alt.
ответ
NekoriDes, тогда да, вариант с мультибоардом лучше. И реализуется легче.

YuliyaQuest, вот пример реализации через мультибоард: www.wc3c.net/showthread.php?t=98138
ответ
Steal nerves:
8gabriel8, точно не уверен.проверял, и ничего (не круг, не полоска - никаких изменений). мне советовали, что спрятать хп-бар можно, если изменить шкалу и высоту выбора. Но работает только шкала выбора. А что значит высота выбора для меня загадка, не работает что-то. Мб с моделью как-то.
это надо у модельщиков спрашивать. Хорошо бы, если кто-то расписал бы в этой теме.

23

» WarCraft 3 / Помогите с ИИ

Похожие вопросы:

ответ
Чтобы увеличить высоту декорации в редакторе, нужно выбрать ёё а затем нажать комбинацию клавиш Ctrl+Page Up нужное количество раз. (Чтобы снизить Ctrl+Page Down.)
ответ
Steal nerves, в Вашем способе, если был выбран вражеский воин, то он обратно не выбирается.
- Предлагаю такой вариант:
    globals
        group  array  selectedUnits
    endglobals


    function HideEnumUnit takes nothing returns nothing
        call ShowUnit( GetEnumUnit( ), false )
    endfunction


    function ShowEnumUnit takes nothing returns nothing
        call ShowUnit( GetEnumUnit( ), true )
    endfunction
    
    
    function actions takes nothing returns nothing
        local  unit     triggerUnit  =  GetTriggerUnit( )
        local  integer  playerId     =  GetPlayerId( GetTriggerPlayer( ) )
        local  group    tGroup       =  null
        local  unit     tUnit        =  null
        local  real     x            =  0.0
        local  real     y            =  0.0

        if ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_SELECTED ) then

            if ( selectedUnits[ playerId ] == null ) then
                set  selectedUnits[ playerId ]  =  CreateGroup( )
                call GroupAddUnit( selectedUnits[ playerId ], triggerUnit )
                call BJDebugMsg( GetUnitName( triggerUnit ) + " selected" )

            elseif ( selectedUnits[ playerId ] != null ) then
                call GroupAddUnit( selectedUnits[ playerId ], triggerUnit )
                call BJDebugMsg( GetUnitName( triggerUnit ) + " selected" )
            endif



        elseif ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_DESELECTED ) then
            call GroupRemoveUnit( selectedUnits[ playerId ], triggerUnit )
            call BJDebugMsg( GetUnitName( triggerUnit ) + " deselected" )



        elseif( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_DEATH ) then

            set  x  =  GetUnitX( triggerUnit )
            set  y  =  GetUnitY( triggerUnit )

            if ( GetUnitTypeId( triggerUnit ) == 'halt' ) then

                call ClearSelection( )

                set  tGroup  =  CreateGroup( )
                call GroupEnumUnitsInRange( tGroup, x, y, 512.0, null )
                call ForGroup( tGroup, function HideEnumUnit )
                call CreateUnit( Player( 0 ), 'halt', x, y, bj_UNIT_FACING )
                call ForGroup( tGroup, function ShowEnumUnit )

                call SelectGroupForPlayerBJ( selectedUnits[ 0 ], Player( 0 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 1 ], Player( 1 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 2 ], Player( 2 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 3 ], Player( 3 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 4 ], Player( 4 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 5 ], Player( 5 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 6 ], Player( 6 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 7 ], Player( 7 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 8 ], Player( 8 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 9 ], Player( 9 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 10 ], Player( 10 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 11 ], Player( 11 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 12 ], Player( 12 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 13 ], Player( 13 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 14 ], Player( 14 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 15 ], Player( 15 ) )
            endif

        endif

        call DestroyGroup( tGroup )
        set  triggerUnit  =  null
    endfunction


function InitTrig_Untitled_Trigger_001_Copy_Copy takes nothing returns nothing
    local  trigger  trig  =  CreateTrigger( )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_SELECTED,  null )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_DESELECTED,  null )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_DEATH,  null )

    call TriggerAddAction( trig, function actions )

    set trig = null
endfunction
для работы требуется JNGP.
ответ
Самый простой алгоритм - для каждого юнита-цели создаешь даммик (Юнит со способностью москиты 'Aloc', без модели, тени и с отключенной атакой), который, получив нужный приказ, радостно кидает корни с нужными параметрами в оную цель. Не забудь применить к даммику ограничение времени жизни, чтобы он скастовал и благополучно сдох.
Герою же просто выдаешь пустышку на основе нейтрально-враждебной геройской способности Канал, срабатывание которой и отлавливаешь триггером, делающим вышеуказанные действия.

23

» WarCraft 3 / ''Анимация снаряда''

Принятый ответ
Похожие вопросы:

ответ
Там есть способность у ящерицы - Электрическая атака (это такой орб эффект, который прикрепляет анимацию молнии )
ответ
Убрать звуки моделям в War3ME или вместо анимаций прятать юнитов (Unit - Hide).
Steal nerves, добавлю: чтобы сделать их бессмертными и невыбираемыми, можно дать способность "Москиты". Тень убирается в РО.
ответ
В РО, такое невозможно сделать. Подробно на триггерах? Ну вот пример, а если нужно ещё подробнее, то учебник по Jass в руки.
На проклятие в РО,или любой другой спелл,ставится минимальная дистанция
function Trig_Spell_Actions takes nothing returns nothing
local location loc = Location(GetWidgetX(GetSpellAbilityUnit()),GetWidgetY(GetSpellAbilityUnit()))
local unit u = null
if GetSpellAbilityId() == 'АЙ ДИ СКИЛЛА' then
set u = CreateUnitAtLoc(GetOwningPlayer(GetSpellAbilityUnit()),'АЙ ДИ ДАММИ ЮНИТА-ЭФФЕКТА',loc,0.00)
call IssueTargetOrder(u,"curse",GetSpellTargetUnit())
endif
call RemoveLocation(loc)
set loc = null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    local integer i = 0
    set gg_trg_Spell = CreateTrigger()
    loop 
    exitwhen i > 12
        call TriggerRegisterPlayerUnitEvent(gg_trg_Spell, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set i = i + 1
    endloop
    call TriggerAddAction( gg_trg_Spell , function Trig_Spell_Actions )
endfunction
Потом тоже самое, только отследить каст проклятия, проверить тип юнита и удалить его из игры.
ответ
Морф в другого героя, а так же сферу чародея крови (она вроде не сбивает другие орбы, но сбивается другими орбами)
ответ
Либо пассивка вивера из доты (это вам описали как сделать, изи скилл из РО), либо триггерно!
Третьего не дано!

23

» WarCraft 3 / Код проверки видимости. Jass

Похожие вопросы:

ответ
Объясню, почему я удалил код: после проведённого за кодом времени, я понял, что сильно погорячился, задав такой глупый вопрос. Стоило отдохнуть, проветрить голову, и решение нашлось. Тем, кто столкнулся с хоть самую малость, но похожей проблемой, дам совет: всегда проверяйте соответствия заклинаний, написанных в коде jass (CTRL + D, если кто не знает, как узнать id заклинания) и ,конечно, сам синтаксис. Также посоветую не утраивать "свалку" в коде, как это сделал я. В общем, если кому интересно, как я решил проблему, пишите - расскажу или даже помогу если у вас она схожая.(Всё дело во внимательности)...
Сброшу код триггера таким, каким я его хотел видеть изначально:
function MU_Check_lvl_four takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 4 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_three takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 3 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_two takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 2 ) ) then
        return false
    endif
    return true
endfunction

function MU_Check_lvl_one takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 1 ) ) then
        return false
    endif
    return true
endfunction

function MU_Second_Conditions takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetEventDamageSource(), 'B008') == true ) ) then
        return false
    endif
    if ( not ( GetEventDamageSource() == udg_Akame_Killer ) ) then
        return false
    endif
    return true
endfunction

function MU_Start_Conditions takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetAttacker(), 'B008') == true ) ) then
        return false
    endif
    if ( not ( GetAttacker() == udg_Akame_Killer ) ) then
        return false
    endif
    return true
endfunction

function Trig_MU_Conditions takes nothing returns boolean
    if ( not MU_Start_Conditions() ) then
        return false
    endif
    return true
endfunction

function MU_Venum_Check takes nothing returns boolean
    if ( not ( udg_MU_Venum_counter == 2 ) ) then
        return false
    endif
    return true
endfunction

function MU_del takes nothing returns nothing 
    if ( MU_Check_lvl_one() ) then
        call SetPlayerAbilityAvailableBJ( true, 'A00X', GetOwningPlayer(GetEventDamageSource()) )
        call UnitRemoveAbilityBJ( 'A00X', GetEventDamageSource() )
    else
        if ( MU_Check_lvl_two() ) then
            call SetPlayerAbilityAvailableBJ( true, 'A00U', GetOwningPlayer(GetEventDamageSource()) )
            call UnitRemoveAbilityBJ( 'A00U', GetEventDamageSource() )
        else
            if ( MU_Check_lvl_three() ) then
                call SetPlayerAbilityAvailableBJ( true, 'A00Y', GetOwningPlayer(GetEventDamageSource()) )
                call UnitRemoveAbilityBJ( 'A00Y', GetEventDamageSource() )
            else
                if ( MU_Check_lvl_four() ) then
                    call SetPlayerAbilityAvailableBJ( true, 'A013', GetOwningPlayer(GetEventDamageSource()) )
                    call UnitRemoveAbilityBJ( 'A013', GetEventDamageSource() )
                else
                    call DoNothing(  )
                endif
            endif
        endif
    endif
endfunction


function Trig_MU_Actions takes nothing returns nothing
    call DestroyTrigger(udg_MU_trig)
    set udg_MU_Venum_counter = GetRandomInt(1, 5)
    set udg_MU_TG = GetAttackedUnitBJ()
    if ( MU_Venum_Check() ) then
        if ( MU_Check_lvl_one() ) then
        call UnitAddAbilityBJ( 'A00X', udg_Akame_Killer )
        call SetPlayerAbilityAvailableBJ( false, 'A00X', GetOwningPlayer(udg_Akame_Killer) )
    else
        if ( MU_Check_lvl_two() ) then
            call UnitAddAbilityBJ( 'A00U', udg_Akame_Killer )
            call SetPlayerAbilityAvailableBJ( false, 'A00U', GetOwningPlayer(udg_Akame_Killer) )
        else
            if ( MU_Check_lvl_three() ) then
                call UnitAddAbilityBJ( 'A00Y', udg_Akame_Killer )
                call SetPlayerAbilityAvailableBJ( false, 'A00Y', GetOwningPlayer(udg_Akame_Killer) )
            else
                if ( MU_Check_lvl_four() ) then
                    call UnitAddAbilityBJ( 'A013', udg_Akame_Killer )
                    call SetPlayerAbilityAvailableBJ( false, 'A013', GetOwningPlayer(udg_Akame_Killer) )
                else
                    call DoNothing(  )
                endif
            endif
        endif
    endif
    set udg_MU_trig = CreateTrigger()
    call TriggerRegisterUnitEvent( udg_MU_trig, udg_MU_TG, EVENT_UNIT_DAMAGED )
    call TriggerAddCondition( udg_MU_trig, Condition( function MU_Second_Conditions ) )
    call TriggerAddAction( udg_MU_trig, function MU_del )
    else
        call DoNothing(  )
    endif
endfunction

//===========================================================================
function InitTrig_MU takes nothing returns nothing
    set gg_trg_MU = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MU, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_MU, Condition( function Trig_MU_Conditions ) )
    call TriggerAddAction( gg_trg_MU, function Trig_MU_Actions )
endfunction
Суть триггера:
Имеется способность с четырьмя уровнями. На каждом уровне урон способности разный, а шанс срабатывания всегда 25%. При атаке герой, имеющий такую способность имеет шанс (25%) на отравление противника.
Переменная udg_Akame_killer равносильна GetEventDamageSource()
P.S. Возможно кому-то даже пригодится этот код... Сделан полнейшим неумехой в плане jass, так что не судите строго!

23

» WarCraft 3 / DestroyTrigger

Похожие вопросы:

ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
ответ
Не не совсем, посмотри в моей карте как правильно удалять.
ответ
Удаляет сработавший триггер, если находится в потоке триггера.
Это делать не следует, так делают те у кого еще не было проблем от этого...
ответ
Kind Ram, еще внезапно есть - это
Там изи детект всех видов урона и есть даже пример как это сделать....
ответ
есть мнение, что это может оставить утечку, лучше воспользоваться независимым таймером и утилизировать через секунд 30